객체 지향 설계 5대 원칙 - SOLID

OOP를 올바르게 설계 하는 방법

Posted by Yungwang Ryu on 2019-05-23

SOLID 란?

객체지향이 탄생이후 50년 동안 수많은 시행착오 속에 태어난 5가지 원칙을 Robert C. Martin 이 2000년대 초반 객체 지향 프로그래밍 및 설계의 다섯 가지 기본 원칙으로 제시한 것을 Michael Feathers 가 앞글자만 따서 소개한 것이다.

  • SRP(Single Responsibility Principle) 단일 책임 원칙
  • OCP(Open Closed Principle) 개방 폐쇄 원칙
  • LSP(Liskov Substitution Principle) 리스코프 치환 원칙
  • ISP(Interface Segregation Principle) 인터페이스 분리 원칙
  • DIP(Dependency Inversion Principle) 의존 역전 법칙

객체지향 4대 요소인 추상화, 상속, 다형성, 캡슐화는 건물을 짓기 위해 필요한 도구 즉, 망치, 파워크레인, 시멘트 등등 이 된다면 위 SOLID 원칙은 망치를 올바르게 사용하는 법, 시멘트를 올바르게 사용하는 법, 도구를 올바르게 사용하는 법이 SOLID 원칙인 것이다.

SRP(Single Responsibility Principle) 단일 책임 원칙

어떤 클래스를 변경해야 하는 이유는 오직 하나뿐이어야 한다.

SOLID 는 도구를 올바르게 사용하는 법이라고 표현하였는데 그럼 SOLID중에 하나인 SRP는 객체지향 4가지 도구중에 어떤 도구에 가장 잘 해당할까??

바로 추상화(모델링) 이다.

왜 그럴까?? 자, 클래스 변경하는 이유는 한가지여야 한다. 그 말뜻은 한가지 책임만 지어야 가능한 말이다. 그럼 클래스를 설계할 때 한가지 기능만 수행 할 수 있도록 모델링은 해야 한다는 뜻인데 바로 이러한 과정은 객체 지향 도구인 추상화에 해당하는 내용이기 때문이다.

그렇다면 왜 클래스는 한가지 기능만 수행해야 좋은 걸까??
바로 아래 클래스 설계도를 보자 아이언맨이 물론 필수로 해야 하는 기능들이긴 하지만 예를들어 평화가 찾아와 더이상 전투 기능을 사용하지 않는다고 해보자 근데도 여전히 아이언맨 클래스 내에서 전투 기능이 존재하여 다른 책임 예를 들어 인공 지능 기능에서 자꾸 전투 기능에서 사용한 것이 영향을 받게 된다. 즉, 책임이 너무 많다 보니 다른 책임들에게 영향을 끼치는 것이다.

책임에 따라 아래와 같이 분리 하게 되면 더이상 다른 책임들간에 간섭은 없게 된다. 또한 각 클래스가 어떤 역활을 하는지 더 명확해 졌다.
코드로 단일책임이 왜 필요한지 봐보겠다

1
2
아이언맨 mark15 = new 아이언맨();
mark15.조립();

엥?? mark15라는 아이언맨이 탄생했는데 mark15를 조립한다고? 하나의 클래스에 우겨넣고 잘못된 추상화로 인해서 인간이 쉽게 이해하면서 프로그래밍 하는 방법이 객체지향인데 말이 안 맞는 코드가 된것이다. 바로 너무 많은 책임을 갖게 되면서 나타는 코드 냄새이다.